home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MYUTIL / CMPFILES.M < prev    next >
Encoding:
Text File  |  1992-05-07  |  8.9 KB  |  348 lines

  1. MODULE CmpFiles; (*$E MTP *)
  2.  
  3. IMPORT GEMDOSIO;
  4.  
  5. FROM Clock IMPORT Time, Date, UnpackTime, UnpackDate;
  6.  
  7. FROM SysUtil0 IMPORT VarEqual;
  8.  
  9. FROM ArgCV IMPORT PtrArgStr, InitArgCV;
  10.  
  11. FROM InOut IMPORT Write, WriteLn, WriteString, WriteInt, Read, ReadString;
  12.  
  13. FROM Files IMPORT File, Access, Open, Close, State;
  14.  
  15. FROM Binary IMPORT FileSize, ReadBytes;
  16.  
  17. FROM Directory IMPORT DirQuery, DirEntry, subdirAttr, FileAttrSet;
  18.  
  19. FROM Strings IMPORT StrEqual, String, Empty, Append, Assign, Length, Space,
  20.         Upper, Concat;
  21.  
  22. FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE, BYTE, WORD, LONGWORD, ASSEMBLER;
  23.  
  24.  
  25. CONST   cmpFile = TRUE;
  26.  
  27.  
  28. VAR subdirs, ok: BOOLEAN;
  29.     c: CHAR;
  30.     res: INTEGER;
  31.     destpath: String;
  32.     buf1, buf2: ARRAY [1..$8000] OF CARDINAL;
  33.     
  34.  
  35. PROCEDURE missing (s: ARRAY OF CHAR; dir: BOOLEAN);
  36.   BEGIN
  37.     WriteLn;
  38.     WriteString (s);
  39.     IF dir THEN
  40.       WriteString (Space (40-Length(s)));
  41.       WriteString (' <DIR>')
  42.     END;
  43.   END missing;
  44.  
  45. PROCEDURE GetDirEntry ( fileName: ARRAY OF CHAR;
  46.                         VAR entry: DirEntry; VAR found: BOOLEAN );
  47.   (*
  48.    * Liefert die Directory-Daten einer Datei.
  49.    * Existiert die Datei nicht auf dem angegebenen Pfad oder ist der
  50.    * angegebene Name ein Unterverzeichnis oder ein Volume-Label,
  51.    * liefert 'found' FALSE.
  52.    *)
  53.  
  54.   (*$L-*)
  55.   
  56.   PROCEDURE str0;
  57.     BEGIN
  58.       ASSEMBLER
  59.         ; D0: HIGH (s)
  60.         ; A0: ADR (s)
  61.         ; D2 erhalten !
  62.         MOVE.L  (A7)+,A1
  63.         
  64.         MOVE    D0,D1
  65.         ADDQ    #3,D1
  66.         BCLR    #0,D1
  67.         
  68.         ; LINK:
  69.         PEA     (A5)
  70.         MOVE.L  A7,A5
  71.         SUBA.W  D1,A7
  72.         
  73.         CMPA.L  A3,A7
  74.         BLS     E
  75.         MOVE.L  A7,A2
  76.         
  77.      L: MOVE.B  (A0)+,(A2)+
  78.         DBRA    D0,L
  79.         CLR.B   (A2)+
  80.         
  81.         MOVE.L  A7,D0
  82.         JMP     (A1)
  83.      
  84.      E: TRAP    #6      ; OUT OF STACK
  85.         DC.W    -10
  86.       END
  87.     END str0;
  88.  
  89.   PROCEDURE setDta;
  90.     BEGIN
  91.       ASSEMBLER
  92.         ; get old DTA
  93.         MOVE    #$2F,-(A7)
  94.         TRAP    #1
  95.         MOVE.L  D0,D3           ; alten DTA merken in D3
  96.         ; set new DTA
  97.         MOVE.L  D4,-(A7)
  98.         MOVE    #$1A,-(A7)
  99.         TRAP    #1
  100.         ADDQ.L  #8,A7
  101.       END
  102.     END setDta;
  103.  
  104.   PROCEDURE rstDta;
  105.     BEGIN
  106.       ASSEMBLER
  107.         ; reset old DTA, erhalte D0 !
  108.         MOVE.L  D0,-(A7)
  109.         MOVE.L  D3,-(A7)
  110.         MOVE    #$1A,-(A7)
  111.         TRAP    #1
  112.         ADDQ.L  #6,A7
  113.         MOVE.L  (A7)+,D0
  114.       END
  115.     END rstDta;
  116.  
  117.   BEGIN
  118.     ASSEMBLER
  119.         MOVE.L  -14(A3),A0
  120.         MOVE.W  -10(A3),D0
  121.         BSR     str0
  122.         
  123.         MOVEM.L D3/D4,-(A7)
  124.         
  125.         ; DTA anlegen
  126.         SUBA.W  #44,A7
  127.         MOVE.L  A7,D4
  128.         
  129.         CLR.W   -(A7)           ; Attribut
  130.         MOVE.L  D0,-(A7)        ; zuerst D0 (^name) sichern
  131.         BSR     setDta          ; dann DTA sichern/umsetzen
  132.         MOVE    #$4E,-(A7)
  133.         TRAP    #1              ; FSFIRST
  134.         ADDQ.L  #8,A7
  135.         BSR     rstDta
  136.         
  137.         MOVE.L  -8(A3),A1       ; ADR (entry)
  138.         
  139.         ; Name in Dir vorhanden ?
  140.         TST.L   D0
  141.         BMI     fals
  142.         
  143.         ; Prüfen, ob es ein normales File ist (nicht Subdir/volID)
  144.         MOVE.B  21(A7),D0
  145.         ANDI    #11000%,D0
  146.         BNE     fals
  147.         
  148.         ; DirEntry kopieren, DTA ist direkt auf dem Systemstack
  149.         ; name
  150.         MOVEQ   #5,D0
  151.         LEA     $1E(A7),A0
  152.     L0: MOVE.W  (A0)+,(A1)+
  153.         DBRA    D0,L0
  154.         ; attr
  155.         MOVE.B  21(A7),(A1)+
  156.         CLR.B   (A1)+
  157.         ; time
  158.         MOVE    22(A7),(A3)+
  159.         MOVE.L  A1,-(A7)
  160.         JSR     UnpackTime
  161.         MOVE.L  (A7)+,A1
  162.         MOVE.L  -6(A3),(A1)+
  163.         MOVE.W  -(A3),(A1)+
  164.         SUBQ.L  #4,A3
  165.         ; date
  166.         MOVE    24(A7),(A3)+
  167.         MOVE.L  A1,-(A7)
  168.         JSR     UnpackDate
  169.         MOVE.L  (A7)+,A1
  170.         MOVE.L  -6(A3),(A1)+
  171.         MOVE.W  -(A3),(A1)+
  172.         SUBQ.L  #4,A3
  173.         ; size
  174.         MOVE.L  26(A7),(A1)+
  175.         MOVEQ   #1,D0
  176.         BRA     ende
  177.         
  178.       fals
  179.         ; entry löschen
  180.         MOVEQ   #14,D0
  181.     l1: CLR.W   (A1)+
  182.         DBRA    D0,l1
  183.         MOVEQ   #0,D0
  184.         
  185.       ende
  186.         MOVE.L  -(A3),A0        ; ok
  187.         MOVE    D0,(A0)
  188.         
  189.         SUBA.W  #10,A3          ; name + entry
  190.         ADDA.W  #44,A7
  191.         MOVEM.L (A7)+,D3/D4
  192.         UNLK    A5
  193.     END
  194.   END GetDirEntry;
  195.   (*$L=*)
  196.  
  197. PROCEDURE checkFile (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  198.  
  199.   VAR source, dest: String; destentry: DirEntry;
  200.  
  201.   PROCEDURE equal (a,b: ADDRESS; n: LONGCARD): BOOLEAN;
  202.     VAR r: BOOLEAN;
  203.     BEGIN
  204.       ASSEMBLER
  205.         MOVE.L  a(A6),A0
  206.         MOVE.L  b(A6),A1
  207.         MOVE.L  n(A6),D0
  208.         MOVEQ   #0,D1
  209.         BRA     l
  210.      l2 SWAP    D0
  211.      l1 CMPM.B  (A0)+,(A1)+
  212.      l  DBNE    D0,l1
  213.         BNE     f
  214.         SWAP    D0
  215.         DBRA    D0,l2
  216.         MOVE.B  -1(A0),D0
  217.         CMP.B   -1(A1),D0
  218.      f  SEQ     D0
  219.         ANDI    #1,D0
  220.         MOVE    D0,r(A6)
  221.       END;
  222.       RETURN r
  223.     END equal;
  224.   
  225.   PROCEDURE filesEqual (REF source, dest: ARRAY OF CHAR): BOOLEAN;
  226.     VAR f1, f2: File; n, n1: LONGCARD;
  227.     BEGIN
  228.       Open (f1, source, readOnly);
  229.       IF State (f1) < 0 THEN RETURN FALSE END;
  230.       Open (f2, dest, readOnly);
  231.       IF State (f2) < 0 THEN RETURN FALSE END;
  232.       n:= SIZE (buf1);
  233.       LOOP
  234.         ReadBytes (f1, ADR (buf1), n, n1);
  235.         ReadBytes (f2, ADR (buf2), n, n);
  236.         IF n <> n1 THEN
  237.           Close (f1); Close (f2);
  238.           RETURN FALSE
  239.         ELSIF n=0L THEN
  240.           EXIT
  241.         ELSIF ~equal (ADR (buf1), ADR (buf2), n) THEN
  242.           Close (f1); Close (f2);
  243.           RETURN FALSE
  244.         END
  245.       END;
  246.       Close (f1); Close (f2);
  247.       RETURN TRUE
  248.     END filesEqual;
  249.  
  250.   BEGIN
  251.     Concat (destpath, entry.name, dest, ok);
  252.     Concat (path, entry.name, source, ok);
  253.     GetDirEntry (dest, destentry, ok);
  254.     IF NOT ok
  255.     OR (destentry.attr # entry.attr)
  256.     OR NOT VarEqual (destentry.time, entry.time)
  257.     OR NOT VarEqual (destentry.date, entry.date)
  258.     OR (destentry.size # entry.size)
  259.     OR NOT StrEqual (destentry.name, entry.name)
  260.     OR (cmpFile & NOT filesEqual (source, dest)) THEN
  261.       Concat (path, entry.name, dest, ok);
  262.       missing (dest, FALSE)
  263.     END;
  264.     RETURN TRUE
  265.   END checkFile;
  266.  
  267. PROCEDURE checkDDir (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  268.  
  269.   BEGIN
  270.     RETURN FALSE
  271.   END checkDDir;
  272.  
  273. PROCEDURE checkDir (REF path: ARRAY OF CHAR; entry: DirEntry): BOOLEAN;
  274.  
  275.   VAR lastpath, dest, source: String;
  276.  
  277.   BEGIN
  278.     IF subdirAttr IN entry.attr THEN
  279.       IF entry.name[0] # '.' THEN
  280.         Concat (path, entry.name, source, ok);
  281.         (*
  282.           WriteLn;
  283.           WriteString ('// Path ');
  284.           WriteString (source);
  285.         *)
  286.         Append ('\', source, ok);
  287.         lastpath:= destpath;
  288.         Append (entry.name, destpath, ok);
  289.         Append ('\', destpath, ok);
  290.         Concat (destpath, '*.*', dest, ok);
  291.         DirQuery (dest, FileAttrSet {}, checkDDir, res);
  292.         IF (res < 0) AND (res # -33) THEN
  293.           missing (source, TRUE);
  294.         ELSE
  295.           Append ('*.*', source, ok);
  296.           DirQuery (source, FileAttrSet {}, checkFile, res);
  297.           DirQuery (source, FileAttrSet {subdirAttr}, checkDir, res);
  298.           IF res < 0 THEN
  299.             HALT
  300.           END
  301.         END;
  302.         destpath:= lastpath;
  303.       END
  304.     END;
  305.     RETURN TRUE
  306.   END checkDir;
  307.  
  308.  
  309. VAR     argv: ARRAY [0..3] OF PtrArgStr;
  310.         argc: CARDINAL;
  311.         n1: String;
  312.         ch: CHAR;
  313.  
  314. BEGIN
  315.   InitArgCV ( argc, argv );
  316.   IF argc > 2 THEN
  317.     Assign (argv[1]^, n1, ok);
  318.     Assign (argv[2]^, destpath, ok);
  319.     subdirs:= argc > 3
  320.   ELSE
  321.     WriteString ('First folder  ? ');
  322.     ReadString (n1);
  323.     IF Empty (n1) THEN RETURN END;
  324.     WriteString ('Second folder ? ');
  325.     ReadString (destpath);
  326.     IF Empty (destpath) THEN RETURN END;
  327.   END;
  328.   
  329.   Upper (n1);
  330.   Upper (destpath);
  331.   (*
  332.   WriteString ('// Path ');
  333.   WriteString (n1);
  334.   *)
  335.   Append ('*.*', n1, ok);
  336.   DirQuery (n1, FileAttrSet {}, checkFile, res);
  337.   DirQuery (n1, FileAttrSet {subdirAttr}, checkDir, res);
  338.   IF res < 0 THEN
  339.     WriteLn;
  340.     WriteString ('Error #');
  341.     WriteInt (res,0)
  342.   END;
  343.   
  344.   WriteLn;
  345. END CmpFiles.
  346. ə
  347. (* $FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$00000570$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3A$FFF68C3AÇ$00000280T.......T.......T.......T.......T.......T..T....T.......T.......T.......T.......$000018F8$00000280$00000273$000016BB$000016FF$00001588$00001735$0000149C$00001789$0000122C$00001789$FFEA5B5C$FFEA5B5C$FFEA5B5C$00001791$000017A3îÇÇ*)
  348.